package Day_0216.JVM.ClassLoader;

/**
 * @author zxc
 * @date 2023/02/16 18:19
 **/
public class JVM_ClassLoader {
    public static void main(String[] args) {
        /**
         * 谈一谈对于类加载机制的理解
         * ===》
         * 1.类加载的概念
         * 虚拟机，把描述类的数据从Class文件加载到虚拟机内存（方法区），并对数据进行校验，解析和初始化，
         * 最终形成可以被虚拟机直接使用的java类型。
         *
         * 2.描述一下JVM加载Class文件的原理机制
         * （1）Java中的所有类，都需要由类加载器装载到JVM中才能运行。
         *  类加载器本身，也是一个类，而它的工作就是把class文件从硬盘读取到内存中。
         *  在写程序的时候，我们几乎不需要关心类的加载，
         *  因为这些都是隐式装载的，除非我们有特殊的用法，像是反射，就需要显式的加载所需要的类。
         *
         * （2）类装载方式 ：
         *  1）隐式装载 ：
         *  程序在运行过程中，当碰到通过new 等方式生成对象时，隐式调用类装载器，加载对应的类到JVM中，
         *  2）显式装载 ：
         *  通过class.forname()等方法，显式加载需要的类;
         *
         * ====>
         * 总结 ：
         * （1）Java类加载是动态的，它并不会一次性将所有类全部加载后再运行，而保证程序运行的基础类(像是基类)会被完全加载到JVM中;
         * （2）至于其他类，则在需要的时候才加载。这当然就是为了节省内存开销。
         *
         */

        /**
         * 谈一谈对于类加载机制的理解
         * ===》
         * 1.JVM 中类的装载，是由类加载器（ClassLoader）和它的子类来实现的;
         * Java 中的类加载器是一个重要的Java 运行时系统组件，它负责在运行时查找和装入类文件中的类。
         *
         * 2.由于 Java 的跨平台性，经过编译的 Java 源程序并不是一个可执行程序，而是一个或多个类文件。
         * 当Java 程序需要使用某个类时，JVM 会确保这个类已经被加载、连接（验证、准备和解析）和初始化。
         * （1）类的加载 ：
         *  是指把类的.class文件中的数据读入到内存中，通常是创建一个字节数组读入.class 文件，然后产生与所加载类对应的 Class 对象。
         * （2）连接 ：
         *  加载完成后，Class 对象还不完整，所以此时的类还不可用。
         *  当类被加载后就进入连接阶段，
         *  这一阶段包括验证、准备（为静态变量分配内存，并设置默认的初始值）和解析（将符号引用替换为直接引用）。
         * （3）初始化 ：
         *  最后 JVM 对类进行初始化，包括：
         *   1)如果类存在直接的父类 && 这个类还没有被初始化，那么就先初始化父类；
         *   2)如果类中存在初始化语句，就依次执行这些初始化语句。
         *
         * 3.类的加载是由类加载器完成的，类加载器包括：
         * 根加载器（BootStrap）、扩展加载器（Extension）、系统加载器（System）和用户自定义类加载器（java.lang.ClassLoader 的子类）
         * 类加载器的详述 ：
         *（1）Bootstrap：
         * 一般用本地代码实现，负责加载 JVM 基础核心类库（rt.jar）；
         *（2）Extension：
         * 从 java.ext.dirs 系统属性所指定的目录中加载类库，它的父加载器是 Bootstrap；
         *（3）System：
         * 又叫应用类加载器，其父类是 Extension。它是应用最广泛的类加载器。
         * 它从环境变量classpath 或者系统属性java.class.path 所指定的目录中记载类，是用户自定义加载器的默认父加载器。。
         *
         * 4.双亲委派机制 ：
         * （1）类加载过程采取了双亲委托机制（PDM）。PDM 更好的保证了 Java 平台的安全性;
         * （2）在该机制中，JVM 自带的Bootstrap 是根加载器，其他的加载器都有且仅有一个父类加载器。
         *  类的加载，首先请求父类加载器加载，父类加载器无能为力时，才由其子类加载器自行加载。
         *  注意 ：JVM 不会向Java 程序提供对 Bootstrap 的引用。
         *  ===》
         *  总结 ：自底向上委托请求，自顶向下加载类
         *
         */
    }
}
